import "dotenv/config";
import { HumanMessage } from "@langchain/core/messages";
import { ChatOpenAI } from "@langchain/openai";
import { StringOutputParser } from "@langchain/core/output_parsers";
import {
  PromptTemplate,
  ChatPromptTemplate,
  SystemMessagePromptTemplate,
  HumanMessagePromptTemplate,
  PipelinePromptTemplate,
} from "@langchain/core/prompts";

// const greetingPrompt = new PromptTemplate({
//   inputVariables: ["name"],
//   template: "你好，{name}，欢迎使用langchain, {{agent}}",
// });

// const formattedGreetingPrompt = await greetingPrompt.format({ name: "xiaoyi" });

// console.log(formattedGreetingPrompt);

// const autoInferTemplate = PromptTemplate.fromTemplate(
//   "你好，{name}，欢迎使用langchain, {{agent}}"
// );
// console.log(autoInferTemplate.inputVariables);
// const formattedAutoInfer = await autoInferTemplate.format({ name: "xiaohua" });
// console.log(formattedAutoInfer);

// 部分参数
// const initialPrompt = new PromptTemplate({
//   template: "这是一个{type}，它是{item}。",
//   inputVariables: ["type", "item"],
// });

// const partialedPrompt = await initialPrompt.partial({
//   type: "工具",
// });

// const formattedPrompt = await partialedPrompt.format({
//   item: "锤子",
// });

// console.log(formattedPrompt);
// // 这是一个工具，它是锤子。

// const formattedPrompt2 = await partialedPrompt.format({
//   item: "改锥",
// });

// console.log(formattedPrompt2);

// 动态参数
// const getCurrentDateStr = () => {
//   return new Date().toLocaleDateString();
// };

// function generateGreeting(timeOfDay) {
//   return () => {
//     const date = getCurrentDateStr();
//     switch (timeOfDay) {
//       case "morning":
//         return date + " 早上好";
//       case "afternoon":
//         return date + " 下午好";
//       case "evening":
//         return date + " 晚上好";
//       default:
//         return date + " 你好";
//     }
//   };
// }

// const prompt = new PromptTemplate({
//   template: "{greeting}!",
//   inputVariables: ["greeting"],
// });

// const currentTimeOfDay = "afternoon";
// const partialPrompt = await prompt.partial({
//   greeting: generateGreeting(currentTimeOfDay),
// });

// const formattedPrompt = await partialPrompt.format();

// console.log(formattedPrompt);

// chatPromptTemplate

// const translateInstructionTemplate =
//   SystemMessagePromptTemplate.fromTemplate(`你是一个专
//     业的翻译员，你的任务是将文本从{source_lang}翻译成{target_lang}。`);

// // const variables = translateInstructionTemplate.inputVariables;
// // console.log(variables);

// const userQuestionTemplate =
//   HumanMessagePromptTemplate.fromTemplate("请翻译这句话：{text}");

// const chatPrompt = ChatPromptTemplate.fromMessages([
//   translateInstructionTemplate,
//   userQuestionTemplate,
// ]);

// const formattedChatPrompt = await chatPrompt.formatMessages({
//   source_lang: "中文",
//   target_lang: "法语",
//   text: "你好，世界",
// });

// console.log(formattedChatPrompt);

// const systemTemplate = "你是一个专业的翻译员，你的任务是将文本从{source_lang}翻译成{target_lang}。";
// const humanTemplate = "请翻译这句话：{text}";

// const chatPrompt = ChatPromptTemplate.fromMessages([
//   ["system", systemTemplate],
//   ["human", humanTemplate],
// ]);
// const formattedChatPrompt1 = await chatPrompt1.formatMessages({
//   source_lang: "中文",
//   target_lang: "法语",
//   text: "你好，世界",
// });

// console.log(formattedChatPrompt1);

// const chatOpenAI = new ChatOpenAI({
//   configuration: {
//     baseURL: process.env.OPENAI_API_BASE,
//     apiKey: process.env.OPENAI_API_KEY,
//   },
// });
// const outputPraser = new StringOutputParser();

// const chain = chatPrompt.pipe(chatOpenAI).pipe(outputPraser);
// chatPrompt.pipe;

// const result = await chain.invoke({
//   source_lang: "中文",
//   target_lang: "英语",
//   text: "你好，世界",
// });

// console.log(result);

const getCurrentDateStr = () => {
  return new Date().toLocaleDateString();
};

const fullPrompt = PromptTemplate.fromTemplate(`
你是一个智能管家，今天是 {date}，你的主人的信息是{info}, 
根据上下文，完成主人的需求
{task}`);

const datePrompt = PromptTemplate.fromTemplate("{date}，现在是 {period}");
const periodPrompt = await datePrompt.partial({
  date: getCurrentDateStr,
});

const infoPrompt = PromptTemplate.fromTemplate(
  "姓名是 {name}, 性别是 {gender}"
);

const taskPrompt = PromptTemplate.fromTemplate(`
我想吃 {period} 的 {food}。 
再重复一遍我的信息 {info}`);

const composedPrompt = new PipelinePromptTemplate({
  pipelinePrompts: [
    {
      name: "date",
      prompt: periodPrompt,
    },
    {
      name: "info",
      prompt: infoPrompt,
    },
    {
      name: "task",
      prompt: taskPrompt,
    },
  ],
  finalPrompt: fullPrompt,
});

const formattedPrompt = await composedPrompt.format({
  period: "晚上",
  name: "张三",
  gender: "male",
  food: "lemon",
});

console.log(formattedPrompt);

const chatOpenAI = new ChatOpenAI({
  configuration: {
    baseURL: process.env.OPENAI_API_BASE,
    apiKey: process.env.OPENAI_API_KEY,
  },
});
const outputPraser = new StringOutputParser();

const chain = composedPrompt.pipe(chatOpenAI).pipe(outputPraser);

const result = await chain.invoke({
  period: "晚上",
  name: "张三",
  gender: "male",
  food: "lemon",
});

console.log(result);
